package com.lixw.aiassistant.tool;

import org.springframework.ai.tool.annotation.Tool;
import org.springframework.ai.tool.annotation.ToolParam;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

@Component
public class OrderFunctionTool {
    
    private final Map<Integer, Order> orderDatabase = new ConcurrentHashMap<>();
    private final AtomicInteger idGenerator = new AtomicInteger(1000);

    @Tool(name = "placeOrder", description = """
    为用户创建新的音频专辑购买订单。当用户表达购买意图，如'我想买xxx专辑'、'下单xxx'时调用此工具。
    注意：此操作会实际扣款并生成正式订单，请确认用户有明确的购买意愿。
    """)
    public String placeOrder(
            @ToolParam(description = "要购买的专辑名称，必须是平台上存在的专辑，如'经典流行音乐合集'、'放松冥想音乐'")
            String productName,

            @ToolParam(description = "购买数量，通常为1，表示购买一张专辑。支持批量购买，但需确保用户余额充足")
            int quantity) {

        int orderId = idGenerator.incrementAndGet();
        Order newOrder = new Order(orderId, productName, quantity, "CREATED", LocalDateTime.now());
        orderDatabase.put(orderId, newOrder);

        return String.format("订单创建成功！订单ID: %d, 商品: %s, 数量: %d, 状态: 已创建",
                orderId, productName, quantity);
    }

    @Tool(name = "getOrderDetails", description = """
    查询指定订单的详细信息。当用户询问'我的订单状态'、'查看订单进度'、'订单xxx到哪里了'时调用。
    可用于跟踪订单状态、查看购买记录或处理售后问题。
    """)
    public String viewOrder(
            @ToolParam(description = "要查询的订单编号，必须是已存在的有效订单ID，如12345")
            int orderId) {

        Order order = orderDatabase.get(orderId);
        if (order == null) {
            return "未找到订单ID: " + orderId + "，请确认订单编号是否正确，或联系客服协助查询。";
        }

        return String.format("""
        📦 订单详情：
        • 订单ID: %d
        • 商品名称: %s
        • 购买数量: %d
        • 当前状态: %s
        • 创建时间: %s
        """, order.id(), order.productName(), order.quantity(),
                order.status(), order.createdTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
    }

    @Tool(name = "cancelOrder", description = """
    取消用户指定的订单。适用于用户改变主意、误操作或发现其他问题需要撤销购买的情况。
    注意：只有状态为'已创建'或'待处理'的订单可以取消，已完成或已发货的订单需要联系人工客服处理退款。
    """)
    public String cancelOrder(
            @ToolParam(description = "要取消的订单编号，用户必须提供有效的订单ID")
            int orderId) {

        Order order = orderDatabase.get(orderId);
        if (order == null) {
            return "未找到订单ID: " + orderId + "，请确认订单编号是否正确。";
        }

        if ("CANCELLED".equals(order.status())) {
            return "订单" + orderId + "已是取消状态，无需重复操作。";
        }

        // 检查订单是否可取消
        if (!Arrays.asList("CREATED", "PENDING").contains(order.status())) {
            return "订单" + orderId + "当前状态为'" + order.status() + "'，无法直接取消。请联系人工客服处理。";
        }

        Order updatedOrder = new Order(order.id(), order.productName(), order.quantity(),
                "CANCELLED", order.createdTime());
        orderDatabase.put(orderId, updatedOrder);

        return String.format("""
        ✅ 订单取消成功！
        • 订单ID: %d
        • 商品: %s
        • 退款金额将原路返回，预计1-3个工作日到账
        • 如有疑问请联系客服
        """, orderId, order.productName());
    }

    @Tool(name = "listUserOrders", description = """
    列出用户的所有历史订单，包括已完成、进行中和已取消的订单。
    当用户询问'我的所有订单'、'查看购买记录'、'历史订单'时调用，帮助用户回顾消费记录。
    """)
    public String listOrders() {
        if (orderDatabase.isEmpty()) {
            return "您目前还没有任何订单记录。";
        }

        StringBuilder sb = new StringBuilder("📋 您的所有订单：\n\n");

        // 按创建时间倒序排列
        orderDatabase.values().stream()
                .sorted((o1, o2) -> o2.createdTime().compareTo(o1.createdTime()))
                .forEach(order -> {
                    String statusEmoji = getStatusEmoji(order.status());
                    sb.append(String.format("%s ID: %d | 商品: %s | 数量: %d | 状态: %s\n",
                            statusEmoji, order.id(), order.productName(),
                            order.quantity(), getStatusText(order.status())));
                });

        return sb.toString();
    }

    // 状态表情符号映射
    private String getStatusEmoji(String status) {
        return switch (status) {
            case "CREATED" -> "🆕";
            case "PENDING" -> "⏳";
            case "COMPLETED" -> "✅";
            case "CANCELLED" -> "❌";
            default -> "📦";
        };
    }

    // 状态文本映射
    private String getStatusText(String status) {
        return switch (status) {
            case "CREATED" -> "已创建";
            case "PENDING" -> "处理中";
            case "COMPLETED" -> "已完成";
            case "CANCELLED" -> "已取消";
            default -> status;
        };
    }

    public record Order(int id, String productName, int quantity, String status, LocalDateTime createdTime) {}
}